package fr.syntheses.blog.Model.Listener;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.sql.DataSource;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

import fr.syntheses.blog.Model.DAO.HQL.HibernateUtil;
import fr.syntheses.blog.beans.Article;
import fr.syntheses.blog.beans.Avatar;
import fr.syntheses.blog.beans.Categorie;
import fr.syntheses.blog.beans.Commentaire;
import fr.syntheses.blog.beans.Ficheutilisateur;
import fr.syntheses.blog.beans.Pays;
import fr.syntheses.blog.beans.Style;
import fr.syntheses.blog.beans.Utilisateur;




public class ApplicationListener implements ServletContextListener{


	Connection cnx;

	/**
	 * init session hibernate.
	 */
	private Session session = null;	

	/**
	 * Le context.
	 */
	private Context context = null;


	/**
	 * La transaction.
	 */
	private Transaction transaction;

	/**
	 * La sessionFactory.
	 */
	private static SessionFactory sessionFactory;


	/**
	 * serviceRegistry.
	 */
	private static ServiceRegistry serviceRegistry;

	//-------------------------------------------------------------
	// Init
	//-------------------------------------------------------------	

	/**
	 * Le logguer log4j.
	 */
	private Logger log = Logger.getLogger(ApplicationListener.class);


	//fonction appel�e lors de la cr�ation du lanceur
	public void contextInitialized(ServletContextEvent servletContextEvent) 
	{

		log.debug("<=============================== ===================================>");
		log.debug("<========Démarrade de l'appilication " + servletContextEvent.getServletContext().getContextPath() + "=====>");
		log.debug("<=============================== ===================================>");

		ServletContext servletContext=servletContextEvent.getServletContext();

		String dataSourceJNDI = servletContext.getInitParameter("dataSourceJNDI");

		try
		{
			context	= new InitialContext();

			DataSource dataSource = (DataSource)context.lookup(dataSourceJNDI);

			if(dataSource==null)
			{
				System.out.println("La dateSource n'a pu être construite. vérifiez présence de votre ressource !");
			}
			else
			{
				// test de la connexion !
				try {
					cnx = dataSource.getConnection();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					log.debug("La dasource a été récupérée avec succès, la connection est :" + !cnx.isClosed());
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				try {
					cnx.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				// fin du test
				servletContext.setAttribute("dataSource", dataSource);
			}

		}
		catch(NamingException e)
		{
			throw new RuntimeException();
		}
		finally
		{
			try
			{
				//fermer le context
				if(context!=null)
				{
					context.close();
				}


			}
			catch(Exception e)
			{
				System.out.println("Erreur lors de initCtx !");
			}

		}
		try {
			HibernateUtil.createSessionFactory();

			log.info("/* SessionFactory hibernate crï¿½ï¿½e avec succï¿½s */");


			// transaction neutre pour la creation de la base (ou sa mise a jour a chaque rechargement du contexte).
			try {


				Configuration configuration = new Configuration();

				configuration.configure();

				serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();   

				sessionFactory = configuration.buildSessionFactory(serviceRegistry);	



			session = sessionFactory.openSession();
			transaction =  session.beginTransaction(); 	
				
//			Style style = new Style();
//			
//			style.setStyle("rougee");
//			
//			session.save(style);
//            transaction.commit();
				

			log.info("/* SUCCESS TRANSACTION TEST */");
			

			} catch (Exception e) {
				log.fatal(e.getMessage());
				e.printStackTrace();
				if (transaction != null) {
					transaction.rollback();
				}
			}

			finally {
				session.flush();
				session.close();
			}
		}
		catch (HibernateException e) {

			log.fatal("/* ------------------------------------------------------------------- */");
			log.fatal("/* ATTENTION GRAVE ERREUR LORS DE LA CREATION DE LA SESSION FACTORY HB */");
			log.fatal(e);
			log.fatal("");
			log.fatal("/*    l'application ne peut dï¿½marrer suite aux erreurs prï¿½cï¿½dentes     */");
			log.fatal("/* ------------------------------------------------------------------- */");

			try {
				throw new ServletException(e);
			} catch (ServletException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}


	}
















	//fonction appel�e lors de la destruction du lanceur
	public void contextDestroyed(ServletContextEvent servletContextEvent)
	{

		log.debug("<=============================== ===================================>");
		log.debug("<========Rechargement de l'appilication " + servletContextEvent.getServletContext().getContextPath() + "=====>");
		log.debug("<=============================== ===================================>");
		try
		{
			//fermer le context
			if(context!=null)
			{
				context.close();
			}
		}
		catch(Exception e)
		{
			System.out.println("Erreur lors de initCtx !");
		}
	}
}
